import Request from './request.js'
import apiList from './request-api.js'
import $helpers from '@/common/utils/helpers.js';
import login from 'common/utils/login.js'
import $storageKeyEnum from '@/common/enum/storage-key.enum.js'
export default function api(url, data = {}) {
	const request = new Request();
	let api = getApiObj(url);

	request.interceptor.request((config, cancel) => {
		/* 请求之前拦截器 */
		let token = $helpers.getCache($storageKeyEnum.token_cache);

		// 如果token不存在，调用cancel 会取消本次请求，但是该函数的catch() 仍会执行
		if (api.auth && !token) {
			// cancel('huiLian-iotBox-client-token 不存在'); // 接收一个参数，会传给catch((err) => {}) err.errMsg === 'token 不存在'
			common();
			return cancel('未登录，弹起授权');
		}

		return config
	});

	request.interceptor.response((response) => {
		/* 请求之后拦截器 */
		// console.log("state:" + response.statusCode)
		if (response.statusCode === 401) { // 服务端返回的状态码不等于200，则reject()
			uni.removeStorageSync($storageKeyEnum.token_cache)
			common();
			return;
			// return response;
		}
   
		if (response.data.status === 1) { // 服务端返回的状态码不等于200，则reject()
			uni.hideLoading();
			uni.showToast({
				title: response.data.msg || '请求出错,稍后重试',
				icon: 'none',
				duration: 1000,
				mask: true
			});
			
		}

		// if (response.config.custom.verification) { // 演示自定义参数的作用
		//   return response.data
		// }
		return response
	}, (response) => { // 预留可以日志上报
		return response
	})

	return request.request({
		url: api.url,
		data,
		method: api.method
	})

}

function getApiObj(url) {
	let apiArray = url.split(".");
	let api = apiList;
	apiArray.forEach(v => {
		api = api[v];
	});
	return api;
}


function common(){
	uni.hideLoading();

	//获取所有页面栈实例列表
	const pages = getCurrentPages();
	//当前页页面实例
	const value = pages[pages.length - 1];

	const lastRequest = $helpers.getCache($storageKeyEnum.last_request)
	if (lastRequest == value.route){
		return cancel('前面已经有弹起授权啦');
	}

	$helpers.setCache($storageKeyEnum.last_request, value.route, 2)
	login.getProvider((data) => {
		console.log("callback-res：" + data)
		login.generalLogin(data)
	})
}
